package com.yugong.util;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;

import java.lang.management.ManagementFactory;

/**
 * 系统工具类
 *
 * @author yugong
 * @date 2024/1/2
 */
@Component
public class SystemUtils {
    /**
     * 获取用户的ip地址
     *
     * @param request HttpServletRequest请求对象
     * @return 用户的ip地址
     */
    public String getIPAddress(HttpServletRequest request) {
        String ipAddress = request.getHeader("X-Forwarded-For");
        if (ipAddress == null) {
            ipAddress = request.getRemoteAddr();
        }
        return ipAddress;
    }

    /**
     * 获取CPU的架构
     *
     * @param request HttpServletRequest请求对象
     * @return CPU的架构
     */
    public String getCpuArch(HttpServletRequest request) {
        return System.getProperty("os.arch");
    }

    /**
     * 获取CPU的平均使用率
     *
     * @return CPU的平均使用率（小数）
     */
    public double getCpuLoadAverage() {
        return ManagementFactory
                .getOperatingSystemMXBean()
                .getSystemLoadAverage();
    }

    /**
     * 获取操作系统的名称
     *
     * @param request HttpServletRequest请求对象
     * @return 操作系统的名称
     */
    public String getOSName(HttpServletRequest request) {
        return System.getProperty("os.name");
    }

    /**
     * 获取JVM的名称
     *
     * @return JVM的名称
     */
    public String getJvmName() {
        return ManagementFactory
                .getRuntimeMXBean()
                .getName();
    }

    /**
     * 获取JDK的版本
     *
     * @return JDK的版本
     */
    public String getJdkVersion() {
        return System.getProperty("java.version");
    }

    /**
     * 获取JVM的启动时间
     *
     * @return JVM的启动时间
     */
    public long getJvmStartTime() {
        return ManagementFactory
                .getRuntimeMXBean()
                .getStartTime();
    }

    /**
     * 获取JVM的运行时间
     *
     * @return JVM的运行时间
     */
    public long getJvmUpTime() {
        return ManagementFactory
                .getRuntimeMXBean()
                .getUptime();
    }

    /**
     * 获取初始化堆内存的使用情况
     *
     * @return 初始化堆内存的使用情况
     */
    public long getHeapMemoryInit() {
        return ManagementFactory
                .getMemoryMXBean()
                .getHeapMemoryUsage()
                .getInit();
    }

    /**
     * 获取最大堆内存的使用情况
     *
     * @return 最大堆内存的使用情况
     */
    public long getHeapMemoryMax() {
        return ManagementFactory
                .getMemoryMXBean()
                .getHeapMemoryUsage()
                .getMax();
    }

    /**
     * 获取已使用堆内存的使用情况
     *
     * @return 已使用堆内存的使用情况
     */
    public long getHeapMemoryUsed() {
        return ManagementFactory
                .getMemoryMXBean()
                .getHeapMemoryUsage()
                .getUsed();
    }

    /**
     * 获取已提交堆内存的使用情况
     *
     * @return 已提交堆内存的使用情况
     */
    public long getHeapMemoryCommitted() {
        return ManagementFactory
                .getMemoryMXBean()
                .getHeapMemoryUsage()
                .getCommitted();
    }

    /**
     * 获取初始化非堆内存的使用情况
     *
     * @return 初始化非堆内存的使用情况
     */
    public long getNonHeapMemoryInit() {
        return ManagementFactory
                .getMemoryMXBean()
                .getNonHeapMemoryUsage()
                .getInit();
    }

    /**
     * 获取最大非堆内存的使用情况
     *
     * @return 最大非堆内存的使用情况
     */
    public long getNonHeapMemoryMax() {
        return ManagementFactory
                .getMemoryMXBean()
                .getNonHeapMemoryUsage()
                .getMax();
    }

    /**
     * 获取已使用非堆内存的使用情况
     *
     * @return 已使用非堆内存的使用情况
     */
    public long getNonHeapMemoryUsed() {
        return ManagementFactory
                .getMemoryMXBean()
                .getNonHeapMemoryUsage()
                .getUsed();
    }

    /**
     * 获取已提交非堆内存的使用情况
     *
     * @return 已提交非堆内存的使用情况
     */
    public long getNonHeapMemoryCommitted() {
        return ManagementFactory
                .getMemoryMXBean()
                .getNonHeapMemoryUsage()
                .getCommitted();
    }
}
